#include "dht11.h"
void delay_us(uint32_t t)
{
     //HAL_Delay(10);
	
	  uint32_t oldtime=SysTick->VAL;
	  uint32_t newtime;
    uint32_t ticks=t*100;	
	  uint32_t  cnt=0;
	  uint32_t load=SysTick->LOAD;
	  while(1)
		{
		   newtime=SysTick->VAL;
			 if(oldtime!=newtime)
			 {
			 
			    if(newtime<oldtime)
					{
					  
					  cnt+=(oldtime-newtime);
					

					}
			    else
					{
					
					  cnt+=(load-newtime+oldtime);
					
					
		
					}
			 
			    if(cnt>=ticks)
					{
					  break;
					
					
					}
			 
			    oldtime=newtime;
			 
			 }

		}

}
void dht11_init()
{  
	__HAL_RCC_GPIOB_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_INIT;
	GPIO_INIT.Mode=GPIO_MODE_OUTPUT_OD;
	GPIO_INIT.Pin=GPIO_PIN_3;
	GPIO_INIT.Pull=GPIO_PULLUP;
	GPIO_INIT.Speed=GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOB,&GPIO_INIT);


}
void dht11_start()
{

   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3, GPIO_PIN_RESET);

   HAL_Delay(20);
	
	 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3, GPIO_PIN_SET);

    delay_us(30);



}


uint8_t dht11_response()
{

	uint16_t time=0;
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)&&time<100)
	{
	 time++;
	 delay_us(1);
  }
	 //printf("0000\r\n");
   if(time>=100)
	 {return 0;}
  //  printf("111\r\n");
   time=0;
	  
		while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)&&time<100)
	{
	 time++;
	 delay_us(1);
  }
	 
   if(time>=100)
	 {return 0;} 
	// printf("222\r\n");
	 return 1;
	 
	 
}
uint8_t dht11_send_byte()
{

 	uint16_t time=0;
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)&&time<100)
	{
	 time++;
	 delay_us(1);
  }
	 
   if(time>=100)
	 {return 2;}

    time=0;
   while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)&&time<100)
	{
	 time++;
	 delay_us(1);
  }
	 
   if(time>=100)
	 {return 2;}
     
   
   delay_us(30);
	 
	 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
	 {return 0;}
	 else
	 {return 1;}



}

uint8_t dht11_send_data()
{
   uint8_t data=0;
  for(int i=0;i<8;i++)
	{
	   data<<=1;
		 data= data|dht11_send_byte();

	}

  return data;

}

void dht11_send(uint8_t*res)
{

  dht11_start();

  if(!dht11_response())
		return ;
	
  for(int i=0;i<5;i++)
	{
	 
	   res[i]=dht11_send_data();

	}

    if(res[4]!=res[0]+res[1]+res[2]+res[3])
		{
		   for(int i=0;i<5;i++)
			{
			   res[i]=0;
			
			
			
			}
		
		
		}
}







